package com.xspace.android.xafview.zxing;

import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.xspace.android.xafcommon.util.BaseRProxy;
import com.xspace.android.xafview.zxing.camera.CameraManager;
import com.xspace.android.xafview.zxing.decoding.InactivityTimer;
import com.xspace.android.xafview.zxing.decoding.ZxingActivityHandler;
import com.xspace.android.xafview.zxing.view.ViewfinderView;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;


public class ZxingActivity extends Activity implements Callback {

	private ZxingActivityHandler handler;
	private ViewfinderView viewfinderView;
	private boolean hasSurface;
	private Vector<BarcodeFormat> decodeFormats;
	private String characterSet;
	private InactivityTimer inactivityTimer;
	private MediaPlayer mediaPlayer;
	private boolean playBeep;
	private static final float BEEP_VOLUME = 0.10f;
	private ImageView mCall, mSound, mLight;
	private boolean callFlag, soundFlag, lightFlag;
	public static ZxingPreferences mPreferences = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mPreferences = new ZxingPreferences(this);
		callFlag = mPreferences.getPfBoolean(ZxingConstant.ZXING_CALL);
		soundFlag = mPreferences.getPfBoolean(ZxingConstant.ZXING_SOUND);
		lightFlag = mPreferences.getPfBoolean(ZxingConstant.ZXING_LIGHT);
		setContentView(BaseRProxy.activity_zxing);
		CameraManager.init(getApplication());
		viewfinderView = (ViewfinderView) findViewById(BaseRProxy.viewfinder_view);
		hasSurface = false;
		inactivityTimer = new InactivityTimer(this);
		mCall = (ImageView) findViewById(BaseRProxy.img_call);
		mSound = (ImageView) findViewById(BaseRProxy.img_sound);
		mLight = (ImageView) findViewById(BaseRProxy.img_light);
		mCall.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				callFlag = !callFlag;
				mPreferences.setPfBoolean(ZxingConstant.ZXING_CALL, callFlag);
				setCallImg();
			}
		});
		mSound.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				soundFlag = !soundFlag;
				mPreferences.setPfBoolean(ZxingConstant.ZXING_SOUND, soundFlag);
				setSoundImg();
			}
		});
		mLight.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				lightFlag = !lightFlag;
				mPreferences.setPfBoolean(ZxingConstant.ZXING_LIGHT, lightFlag);
				setLightImg();
				CameraManager.get().startLight(!lightFlag);
			}
		});
		setCallImg();
		setSoundImg();
		setLightImg();
		Timer mTime = new Timer();
		TimerTask mTask = new TimerTask() {
			@Override
			public void run() {
				CameraManager.get().startLight(!lightFlag);
			}
		};
		mTime.schedule(mTask, 500);
	}

	private void setCallImg() {
		if (callFlag) {
			mCall.setImageResource(BaseRProxy.ic_screenvibration_on_scan);
		} else {
			mCall.setImageResource(BaseRProxy.ic_vibration_off_scan);
		}
	}

	private void setSoundImg() {
		if (soundFlag) {
			mSound.setImageResource(BaseRProxy.ic_sound_on_scan);
		} else {
			mSound.setImageResource(BaseRProxy.ic_sound_off_scan);
		}
	}

	private void setLightImg() {
		if (!lightFlag) {
			mLight.setImageResource(BaseRProxy.ic_flash_on_scan);
		} else {
			mLight.setImageResource(BaseRProxy.ic_flash_off_scan);
		}

	}

	@Override
	protected void onResume() {
		super.onResume();
		SurfaceView surfaceView = (SurfaceView) findViewById(BaseRProxy.preview_view);
		SurfaceHolder surfaceHolder = surfaceView.getHolder();
		if (hasSurface) {
			initCamera(surfaceHolder);
		} else {
			surfaceHolder.addCallback(this);
			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}
		decodeFormats = null;
		characterSet = null;

		playBeep = true;
		AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
		if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
			playBeep = false;
		}
		initBeepSound();

	}

	@Override
	protected void onPause() {
		super.onPause();
		if (handler != null) {
			handler.quitSynchronously();
			handler = null;
		}
		CameraManager.get().closeDriver();
	}

	@Override
	protected void onDestroy() {
		inactivityTimer.shutdown();
		super.onDestroy();
	}

	private void initCamera(SurfaceHolder surfaceHolder) {
		try {
			CameraManager.get().openDriver(surfaceHolder);
		} catch (IOException ioe) {
			return;
		} catch (RuntimeException e) {
			return;
		}
		if (handler == null) {
			handler = new ZxingActivityHandler(this, decodeFormats,
					characterSet);
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		if (!hasSurface) {
			hasSurface = true;
			initCamera(holder);
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		hasSurface = false;

	}

	public ViewfinderView getViewfinderView() {
		return viewfinderView;
	}

	public Handler getHandler() {
		return handler;
	}

	public void drawViewfinder() {
		viewfinderView.drawViewfinder();

	}

	public void handleDecode(Result obj, Bitmap barcode) {
		inactivityTimer.onActivity();
		// viewfinderView.drawResultBitmap(barcode);
		playBeepSoundAndVibrate();
		Intent dataIntent = new Intent(ZxingConstant.ZXING_DIGITNEX);
		dataIntent.putExtra(ZxingConstant.ZXING_DATA, obj.getText());
		sendBroadcast(dataIntent);
		finish();
	}

	private void initBeepSound() {
		if (playBeep && mediaPlayer == null) {
			setVolumeControlStream(AudioManager.STREAM_MUSIC);
			mediaPlayer = new MediaPlayer();
			mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			mediaPlayer.setOnCompletionListener(beepListener);

			AssetFileDescriptor file = getResources().openRawResourceFd(
					BaseRProxy.beep);
			try {
				mediaPlayer.setDataSource(file.getFileDescriptor(),
						file.getStartOffset(), file.getLength());
				file.close();
				mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
				mediaPlayer.prepare();
			} catch (IOException e) {
				mediaPlayer = null;
			}
		}
	}

	private static final long VIBRATE_DURATION = 200L;

	private void playBeepSoundAndVibrate() {
		if (playBeep && mediaPlayer != null && soundFlag) {
			mediaPlayer.start();
		}
		if (callFlag) {
			Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
			vibrator.vibrate(VIBRATE_DURATION);
		}
	}

	/**
	 * When the beep has finished playing, rewind to queue up another one.
	 */
	private final OnCompletionListener beepListener = new OnCompletionListener() {
		public void onCompletion(MediaPlayer mediaPlayer) {
			mediaPlayer.seekTo(0);
		}
	};

}
